package com.zhoug.tmap.json;

import com.google.gson.Gson;
import com.google.gson.JsonElement;
import com.google.gson.JsonParser;
import com.google.gson.reflect.TypeToken;
import com.google.gson.stream.JsonReader;

import java.io.Reader;
import java.lang.reflect.Type;
import java.util.ArrayList;
import java.util.List;

/**
 * @description: 类的简要描述
 * @author: Administrator
 * @date: 2025/9/17 16:41
 */
public class MyGsonUtils {
    private final Gson mGson;

    public static MyGsonUtils with(Gson gson) {
        return new MyGsonUtils(gson);
    }

    public static MyGsonUtils getDefault() {
        return new MyGsonUtils((Gson)null);
    }

    protected MyGsonUtils(Gson gson) {
        if (gson == null) {
            this.mGson = creatGson();
        } else {
            this.mGson = gson;
        }

    }

    private static Gson creatGson() {
        Gson gson = (new Gson()).newBuilder().disableHtmlEscaping().create();
        return gson;
    }

    public String toJson(Object obj) {
        return this.mGson.toJson(obj);
    }

    public <T> T fromJson(String json, Class<T> cls) {
        return json == null ? null : this.mGson.fromJson(json, cls);
    }

    public <T> T fromJson(Object json, Class<T> cls) {
        return json == null ? null : this.mGson.fromJson(json.toString(), cls);
    }

    public <T> List<T> fromJsonList(Object json, TypeToken<List<T>> typeToken) {
        return json == null ? null : (List)this.mGson.fromJson(json.toString(), typeToken.getType());
    }

    public <T> ArrayList<T> fromJsonArrayList(Object json, TypeToken<ArrayList<T>> typeToken) {
        return json == null ? null : (ArrayList)this.mGson.fromJson(json.toString(), typeToken.getType());
    }

    public <T> List<T> fromJsonList(Object json, Type type) {
        return json == null ? null : (List)this.mGson.fromJson(json.toString(), type);
    }

    public <T> ArrayList<T> fromJsonList(Object json, Class<T> clazz) {
        return json == null ? null : (ArrayList)this.mGson.fromJson(json.toString(), (new TypeToken<ArrayList<T>>() {
        }).getType());
    }

    public static boolean isNonNull(JsonElement jsonElement) {
        return jsonElement != null && !jsonElement.isJsonNull();
    }

    public static JsonElement createJsonElement(String json) {
        return (new JsonParser()).parse(json);
    }

    public static JsonElement createJsonElement(Reader reader) {
        return (new JsonParser()).parse(reader);
    }

    public static JsonElement createJsonElement(JsonReader jsonReader) {
        return (new JsonParser()).parse(jsonReader);
    }

}
